#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像路径
    std::string image_path = "../Fig0335(a)(ckt_board_saltpep_prob_pt05).tif";
    
    // 读取图像并转换为灰度图像
    cv::Mat image = cv::imread(image_path, cv::IMREAD_GRAYSCALE);
    
    // 检查图像是否加载成功
    if (image.empty()) {
        std::cout << "Error: Unable to load image from " << image_path << std::endl;
        return -1;
    }
    
    // 显示原图
    cv::imshow("0. Original Image", image);
    
    // 1. 均值平滑（Mean Blurring）
    // 定义均值滤波的窗口大小
    cv::Size mean_kernel_size(5, 5);  // 5x5 窗口
    cv::Mat mean_blurred_image;
    cv::blur(image, mean_blurred_image, mean_kernel_size);
    cv::imshow("1. Mean Blurring", mean_blurred_image);
    
    // 2. 高斯平滑（Gaussian Blurring）
    // 定义高斯滤波的窗口大小和标准差
    cv::Size gaussian_kernel_size(5, 5);  // 5x5 窗口
    int gaussian_sigma = 0;  // 高斯核的标准差
    cv::Mat gaussian_blurred_image;
    cv::GaussianBlur(image, gaussian_blurred_image, gaussian_kernel_size, gaussian_sigma);
    cv::imshow("2. Gaussian Blurring", gaussian_blurred_image);
    
    // 3. 中值滤波（Median Filtering）
    // 定义中值滤波的窗口大小
    int median_kernel_size = 5;  // 使用 5x5 窗口
    cv::Mat median_blurred_image;
    cv::medianBlur(image, median_blurred_image, median_kernel_size);
    cv::imshow("3. Median Blurring", median_blurred_image);
    
    // 4. 双边滤波（Bilateral Filtering）
    // 定义双边滤波的参数
    int bilateral_diameter = 9;  // 邻域直径
    int bilateral_sigma_color = 75;  // 色彩空间的标准差
    int bilateral_sigma_space = 75;  // 坐标空间的标准差
    cv::Mat bilateral_filtered_image;
    cv::bilateralFilter(image, bilateral_filtered_image, bilateral_diameter, bilateral_sigma_color, bilateral_sigma_space);
    cv::imshow("4. Bilateral Filtering", bilateral_filtered_image);
    
    // 5. 方框滤波（Box Filtering）
    // 定义方框滤波的窗口大小
    cv::Size box_kernel_size(5, 5);  // 5x5 窗口
    cv::Mat box_filtered_image;
    cv::boxFilter(image, box_filtered_image, -1, box_kernel_size);
    cv::imshow("5. Box Filtering", box_filtered_image);
    
    // 6. 扩展卷积（Convolution）
    // 定义自定义卷积核
    cv::Mat convolution_kernel = (cv::Mat_<float>(3, 3) << 0, 1, 0,
                                                           1, 1, 1,
                                                           0, 1, 0 );  // 3x3 卷积核
    cv::Mat convolved_image;
    cv::filter2D(image, convolved_image, -1, convolution_kernel);
    cv::imshow("6. Convolution", convolved_image);
    
    // 7. 图像金字塔（Image Pyramid）
    // 应用图像下采样（图像金字塔中的 pyrDown）
    cv::Mat downsampled_image;
    cv::pyrDown(image, downsampled_image);
    cv::imshow("7. Pyramid Downsampling", downsampled_image);
    
    // 等待按键事件并关闭所有显示窗口
    cv::waitKey(0);
    cv::destroyAllWindows();
    
    return 0;
}
